package com.richard.library.http.request;

import java.util.Map;

import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HEAD;
import retrofit2.http.HeaderMap;
import retrofit2.http.PATCH;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;


/**
 * <pre>
 * Description : 基础API服务
 * Author : admin-richard
 * Date : 2017-03-28 19:48
 * Changelog:
 * Version            Date            Author              Detail
 * ----------------------------------------------------------------------
 * 1.0         2017-03-28 19:48     admin-richard         new file.
 * </pre>
 */
public interface BasicAPIService {

    /**
     * GET 请求
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @GET
    Call<ResponseBody> doGet(@Url String url, @HeaderMap Map<String, Object> header, @QueryMap Map<String, Object> params);

    /**
     * GET 请求（以流的形式响应）
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @GET
    @Streaming
    Call<ResponseBody> doGetStreaming(@Url String url, @HeaderMap Map<String, Object> header, @QueryMap Map<String, Object> params);

    /**
     * POST 请求
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @POST
    Call<ResponseBody> doPost(@Url String url, @HeaderMap Map<String, Object> header, @Body Object params);

    /**
     * POST 请求（以流的形式响应）
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @POST
    @Streaming
    Call<ResponseBody> doPostStreaming(@Url String url, @HeaderMap Map<String, Object> header, @Body Object params);

    /**
     * POST表单 请求
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @POST
    @FormUrlEncoded
    Call<ResponseBody> doPostForm(@Url String url, @HeaderMap Map<String, Object> header, @FieldMap Map<String, Object> params);

    /**
     * POST表单 请求（以流的形式响应）
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @POST
    @FormUrlEncoded
    @Streaming
    Call<ResponseBody> doPostFormStreaming(@Url String url, @HeaderMap Map<String, Object> header, @FieldMap Map<String, Object> params);

    /**
     * 上传文件
     *
     * @param url           请求地址
     * @param header        请求header
     * @param params        请求参数
     * @param multipartBody 文件请求内容体
     * @return Call<ResponseBody>
     */
    @POST
    Call<ResponseBody> doUploadFile(@Url String url, @HeaderMap Map<String, Object> header, @QueryMap Map<String, Object> params, @Body RequestBody multipartBody);

    /**
     * 上传文件（以流的形式响应）
     *
     * @param url           请求地址
     * @param header        请求header
     * @param params        请求参数
     * @param multipartBody 文件请求内容体
     * @return Call<ResponseBody>
     */
    @POST
    @Streaming
    Call<ResponseBody> doUploadFileStreaming(@Url String url, @HeaderMap Map<String, Object> header, @QueryMap Map<String, Object> params, @Body RequestBody multipartBody);

    /**
     * DELETE请求
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @DELETE
    Call<ResponseBody> doDelete(@Url String url, @HeaderMap Map<String, Object> header, @Body Object params);

    /**
     * DELETE请求（以流的形式响应）
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @DELETE
    @Streaming
    Call<ResponseBody> doDeleteStreaming(@Url String url, @HeaderMap Map<String, Object> header, @Body Object params);

    /**
     * HEAD请求
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @HEAD
    Call<ResponseBody> doHead(@Url String url, @HeaderMap Map<String, Object> header, @QueryMap Map<String, Object> params);

    /**
     * HEAD请求（以流的形式响应）
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @HEAD
    @Streaming
    Call<ResponseBody> doHeadStreaming(@Url String url, @HeaderMap Map<String, Object> header, @QueryMap Map<String, Object> params);

    /**
     * PATCH请求
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @PATCH
    Call<ResponseBody> doPatch(@Url String url, @HeaderMap Map<String, Object> header, @Body Object params);

    /**
     * PATCH请求（以流的形式响应）
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @PATCH
    @Streaming
    Call<ResponseBody> doPatchStreaming(@Url String url, @HeaderMap Map<String, Object> header, @Body Object params);

    /**
     * PUT请求
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @PUT
    Call<ResponseBody> doPut(@Url String url, @HeaderMap Map<String, Object> header, @Body Object params);

    /**
     * PUT请求（以流的形式响应）
     *
     * @param url    请求地址
     * @param header 请求header
     * @param params 请求参数
     * @return Call<ResponseBody>
     */
    @PUT
    @Streaming
    Call<ResponseBody> doPutStreaming(@Url String url, @HeaderMap Map<String, Object> header, @Body Object params);


}
